/*
 * FreeRTOS V202212.00
 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 *
 * https://www.FreeRTOS.org
 * https://github.com/FreeRTOS
 *
 */

/******************************************************************************
	See http://www.freertos.org/a00110.html for an explanation of the
	definitions contained in this file.
******************************************************************************/

#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H

/*-----------------------------------------------------------
 * Application specific definitions.
 *
 * These definitions should be adjusted for your particular hardware and
 * application requirements.
 *
 * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
 * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
 * https://www.FreeRTOS.org/a00110.html
 *----------------------------------------------------------*/

extern uint32_t SystemCoreClock;

/* Cortex M33 port configuration. */
/* 是否启用内存保护单元（MPU）功能，0为禁用。 */
#define configENABLE_MPU								0
/* 是否启用浮点运算单元（FPU）支持，0为禁用。 */
#define configENABLE_FPU								0
/* 是否启用TrustZone安全扩展，0为禁用。 */
#define configENABLE_TRUSTZONE							0

/* 是否使用优化的任务选择算法，0为禁用。 */
#define configUSE_PORT_OPTIMISED_TASK_SELECTION			0
/* 是否启用抢占式调度，1为启用。 */
#define configUSE_PREEMPTION							1
/* 是否启用时间片轮转调度，1为启用。 */
#define configUSE_TIME_SLICING							1
/* 系统支持的最大任务优先级数。 */
#define configMAX_PRIORITIES							( 5 )
/* 空闲任务是否在有同优先级任务时让出CPU，1为启用。 */
#define configIDLE_SHOULD_YIELD							1
/* 是否使用16位tick计数，0为禁用（使用32位）。 */
#define configUSE_16_BIT_TICKS							0 /* Only for 8 and 16-bit hardware. */

/* CPU主频，通常为SystemCoreClock变量。 */
#define configCPU_CLOCK_HZ								SystemCoreClock
/* 最小任务堆栈大小，单位为字（通常是uint16_t）。 */
#define configMINIMAL_STACK_SIZE						( ( uint16_t ) 128 )
/* 最小安全任务堆栈大小，仅TrustZone相关。 */
#define configMINIMAL_SECURE_STACK_SIZE					( 1024 )
/* 任务名称最大长度。 */
#define configMAX_TASK_NAME_LEN							( 12 )
/* 系统总堆内存大小，单位为字节。 */
#define configTOTAL_HEAP_SIZE							( ( size_t ) ( 5 * 1024 ) )

/* 是否启用tick钩子函数，0为禁用。 */
#define configUSE_TICK_HOOK                             0
/* 是否启用互斥量功能，1为启用。 */
#define configUSE_MUTEXES								1
/* 是否启用tickless低功耗模式，1为启用。 */
#define configUSE_TICKLESS_IDLE							1
/* 是否启用任务标签功能，0为禁用。 */
#define configUSE_APPLICATION_TASK_TAG					0
/* 是否启用newlib重入支持，0为禁用。 */
#define configUSE_NEWLIB_REENTRANT						0
/* 是否启用协程功能，0为禁用。 */
#define configUSE_CO_ROUTINES							0
/* 是否启用计数型信号量，1为启用。 */
#define configUSE_COUNTING_SEMAPHORES					1
/* 是否启用递归互斥量，1为启用。 */
#define configUSE_RECURSIVE_MUTEXES						1
/* 是否启用队列集合，0为禁用。 */
#define configUSE_QUEUE_SETS							0
/* 是否启用任务通知功能，1为启用。 */
#define configUSE_TASK_NOTIFICATIONS					1
/* 是否启用trace调试功能，1为启用。 */
#define configUSE_TRACE_FACILITY						1

/* 是否启用空闲任务钩子函数，0为禁用。 */
#define configUSE_IDLE_HOOK								0
/* 是否启用内存分配失败钩子函数，0为禁用。 */
#define configUSE_MALLOC_FAILED_HOOK					0

/* 堆栈溢出检测方式，0为不检测。 */
#define configCHECK_FOR_STACK_OVERFLOW					0
/* 断言宏，条件不成立时关闭中断并死循环。 */
#define configASSERT( x )								if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for( ;; ); }
/* 队列注册表大小，用于调试。 */
#define configQUEUE_REGISTRY_SIZE						0

/* 是否启用软件定时器，1为启用。 */
#define configUSE_TIMERS								1
/* 定时器任务优先级。 */
#define configTIMER_TASK_PRIORITY						( 3 )
/* 定时器队列长度。 */
#define configTIMER_QUEUE_LENGTH						5
/* 定时器任务堆栈深度。 */
#define configTIMER_TASK_STACK_DEPTH					( configMINIMAL_STACK_SIZE  )

/* 以下宏控制API函数的包含与否，1为包含，0为不包含。 */
#define INCLUDE_vTaskPrioritySet						1
#define INCLUDE_uxTaskPriorityGet						1
#define INCLUDE_vTaskDelete								1
#define INCLUDE_vTaskCleanUpResources					0
#define INCLUDE_vTaskSuspend							1
#define INCLUDE_vTaskDelayUntil							1
#define INCLUDE_vTaskDelay								1
#define INCLUDE_uxTaskGetStackHighWaterMark				0
#define INCLUDE_xTaskGetIdleTaskHandle					0
#define INCLUDE_eTaskGetState							1
#define INCLUDE_xTaskResumeFromISR						0
#define INCLUDE_xTaskGetCurrentTaskHandle				1
#define INCLUDE_xTaskGetSchedulerState					0
#define INCLUDE_xSemaphoreGetMutexHolder				0
#define INCLUDE_xTimerPendFunctionCall					1

/* 是否启用任务状态统计格式化函数，1为启用。 */
#define configUSE_STATS_FORMATTING_FUNCTIONS			1

/* CLI命令输出缓冲区最大长度。 */
#define configCOMMAND_INT_MAX_OUTPUT_SIZE				2048

/* 中断优先级相关配置。 */
/* 使用系统定义的优先级位数。 */
#ifdef __NVIC_PRIO_BITS
    #define configPRIO_BITS								__NVIC_PRIO_BITS
#else
    #define configPRIO_BITS								2	 /* 4 priority levels. */
#endif

/* 可用于设置优先级的最低中断优先级。 */
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY			0x03
/* 内核中断优先级。 */
#define configKERNEL_INTERRUPT_PRIORITY					( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << ( 8 - configPRIO_BITS ) )

/* 是否使用旧版MPU包装器，0为使用新版。 */
#define configUSE_MPU_WRAPPERS_V1						( 0 )
/* 是否启用访问控制列表，1为启用。 */
#define configENABLE_ACCESS_CONTROL_LIST				( 1 )
/* 受保护内核对象池大小。 */
#define configPROTECTED_KERNEL_OBJECT_POOL_SIZE			( 150 )
/* 系统调用堆栈大小。 */
#define configSYSTEM_CALL_STACK_SIZE					( 128 )

#ifndef __IASMARM__
    /* 是否生成运行时统计信息，0为禁用。 */
    #define configGENERATE_RUN_TIME_STATS				0
    /* 配置运行时统计定时器的宏。 */
    #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()
    /* 获取运行时统计计数值的宏。 */
    #define portGET_RUN_TIME_COUNTER_VALUE()			0
    /* 系统tick频率，单位Hz。 */
    #define configTICK_RATE_HZ							( ( TickType_t ) 100 )
#endif /* __IASMARM__ */

/* 是否支持静态内存分配，0为禁用。 */
#define configSUPPORT_STATIC_ALLOCATION					0

#endif /* FREERTOS_CONFIG_H */
